package com.xc.file.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xc.core.bean.QueryBean;
import com.xc.file.bean.FolderBean;
import com.xc.file.bean.FolderFileBean;
import com.xc.file.bean.PackFileBean;
import com.xc.file.bean.UpdateFolderBean;
import com.xc.file.dto.FileDto;
import com.xc.file.dto.FolderDto;
import com.xc.file.dto.FolderFileDto;
import com.xc.file.entity.FolderEntity;
import com.xc.file.model.CrossPointModel;
import com.xc.file.model.SubdirectoryModel;

import java.util.List;
import java.util.function.Consumer;


/**
 * <p>文件夹服务类接口</p>
 *
 * @author xc
 * @version v1.0
 */
public interface FolderService extends IService<FolderEntity> {
    /**
     * <p>添加文件夹</p>
     *
     * @param userId     用户id
     * @param folderName 目录名称
     * @return 添加成功的数据
     */
    public FolderDto createFolder(String userId, String parentId, String folderName);

    /**
     * 创建文件夹
     *
     * @param folderPaths 文件夹路径
     * @param index       下标
     * @param userId      用户id
     * @param parentId    上级id
     * @return 文件夹id
     */
    public String createFolder(String[] folderPaths, int index, String userId, String parentId);

    /**
     * <p>修改文件夹</p>
     *
     * @param userId           用户id
     * @param id               文件夹id
     * @param updateFolderBean 文件夹修改参数
     * @return 修改后的文件文件夹信息
     */
    public FolderDto updateFolder(String userId, String id, UpdateFolderBean updateFolderBean);

    /**
     * <p>查询用户的文件夹集合</p>
     *
     * @param userId     用户id
     * @param queryBean  查询条件
     * @param folderBean 查询条件
     * @return 用户文件夹集合
     */
    public List<FolderDto> getUserFolderList(String userId, QueryBean queryBean, FolderBean folderBean);


    /**
     * <p>删除用户的文件夹集合及以下文件</p>
     *
     * @param userId   用户id
     * @param folderId 文件夹id
     */
    public void deleteUserFolder(String userId, String folderId);


    /**
     * <p>修改用户的文件夹集合<p/>
     * <p>批量移动文件夹及以下文件<p/>
     *
     * @param userId   用户id
     * @param parentId 新目录id
     * @param ids      目录id集合
     * @return 移动后的目录信息
     */
    public List<FolderDto> updateUserFolderList(String userId, String parentId, List<String> ids);

    /**
     * <p>批量复制文件夹及文件<p/>
     *
     * @param userId         用户id
     * @param folderId       新目录id
     * @param folderFileBean 参数
     * @return 复制后的文件夹信息
     */
    public FolderFileDto batchCopyFolderFile(String userId, String folderId, FolderFileBean folderFileBean);

    /**
     * <p>保存共享文件/文件夹<p/>
     *
     * @param userId         用户id
     * @param folderId       文件夹id
     * @param shareId        共享id
     * @param folderFileBean 文件夹和文件的id集合
     * @return 文件和目录信息
     */
    public FolderFileDto saveShareFolderFile(String userId, String folderId, String shareId, FolderFileBean folderFileBean);

    /**
     * <p>递归获取用户文件夹id的所有父集的id,包括自己</p>
     *
     * @param folderId 文件夹id
     * @param userId   用户id，可不传
     * @return 父集id集合
     */
    public List<FolderEntity> getParentFolders(String folderId, String userId);


    /**
     * <p>根据父级id获取文件文件夹集合</p>
     *
     * @param parentId 父级id
     * @return 文件文件夹集合
     */
    public List<FolderEntity> getFoldersByParentId(String parentId);


    /**
     * <p>寻找文件夹的交叉点</p>
     *
     * @param folderId        开始文件夹id
     * @param newFolderId     开始新文件夹id
     * @param crossPointModel 记录寻找过的文件
     * @param action          找到交叉点返回有开始id，到交叉点的数据处理方法
     */
    public boolean seekFolderCrossPoint(String folderId, String newFolderId, CrossPointModel crossPointModel, Consumer<CrossPointModel> action);

    /**
     * <p>递归遍历文件下级文件夹/p>
     *
     * @param parentId    旧的父级id
     * @param newFolderId 新的父级id
     * @param action      回调方法
     */
    public void subdirectoryHandle(String parentId, String newFolderId, Consumer<SubdirectoryModel> action);

    /**
     * 文件目录信息验证
     *
     * @param folderId 文件目录id
     * @param userId   用户id
     */
    public String verifyFolder(String folderId, String userId);

    /**
     * <p>压缩文件和目录</p>
     *
     * @param userId       用户id
     * @param folderId     保存在文件夹id下
     * @param packFileBean 打包参数
     * @return 文件信息
     */
    public FileDto packFolderFiles(String userId, String folderId, PackFileBean packFileBean, String token);

    /**
     * 获取用户文件夹大小
     *
     * @param userId   用户id
     * @param folderId 文件夹id
     * @return 文件夹大小
     */
    public long getUserFolderSize(String userId, String folderId);

    /**
     * 获取文件夹代销
     *
     * @param userId    用户id，可为null
     * @param folderIds 文件夹id集合，查询那些文件夹的大小，不能为空
     * @param fileIds   共享的文件id集合，可为null
     * @return 文件夹大小
     */
    public long getFoldersSize(String userId, List<String> folderIds, List<String> fileIds);
}
